Firestore document の部分更新
firebase.firestore.SetOption の { merge: true } を使う
code:mergeOnUpdate.js
const docRef = await firestore.collection("sketch").doc("partialupdate");
await docRef.set({ v1: "hoge", v2: "fuga", v3: "piyo" });
console.log((await docRef.get()).data()); // #=> { v1: "hoge", v2: "fuga", v3: "piyo" } // 単に document data を置き換える
await docRef.set({ v2: "bar" });
console.log((await docRef.get()).data()); // #=> { v2: "bar" } // マージする
await docRef.set({ v1: 'foo', v3: 'baz'}, { merge: true });
console.log((await docRef.get()).data()); // #=> { v1: 'foo', v3: 'baz', v2: 'bar' } Object ならトップレベルでなくても再帰的にマージされる
code:mergeNested.js
const docRef = await firestore.collection("sketch").doc("merge");
await docRef.set(
{ map: { k1: "hoge", k2: { nested: "fuga" } }, ary: 1, 2, 3 }, { merge: true }
);
console.log((await docRef.get()).data());
// { map: { k1: 'hoge', k2: { nested: 'fuga' } },
await docRef.set(
{ map: { k2: { new: "piyo" }, k3: "mogera" }, ary: 4, 5, 6 }, { merge: true }
);
console.log((await docRef.get()).data());
// { map: { k1: 'hoge', k2: { nested: 'fuga', new: 'piyo' }, k3: 'mogera' },
// トップレベルでなくても再帰的にマージされる
Timestamp は一見 Object に見えるけどマージはされない
code:mergeTimestamp.js
const docRef = await firestore.collection("sketch").doc("mergeTimestamp");
await docRef.set({ time: new Date() });
console.log((await docRef.get()).data());
// { time: Timestamp { _seconds: 1559037710, _nanoseconds: 217000000 } }
await docRef.set({ time: { hoge: "fuga" } }, { merge: true });
console.log((await docRef.get()).data());
// { time: { hoge: 'fuga' } }